package com.info.zhiduoduo.repository.entity.system;

import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import com.info.zhiduoduo.common.annotation.ZddTask;

import org.springframework.scheduling.annotation.Scheduled;

import java.io.Serializable;
import java.util.Date;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;

/**
 * <p>
 *  系统定时任务表
 *
 * </p>
 *
 * @author bob
 * @since 2021-11-29
 */
@Data
@Accessors(chain = true)
@TableName("zdd_system_schedule_task")
public class SystemScheduleTask extends Model<SystemScheduleTask> {

	private static final long serialVersionUID = 1L;

	@TableId(value = "id", type = IdType.AUTO)
	@ApiModelProperty("定时任务主键id")
	private Integer id;
	/**
	 * 任务名称，从@ZddTask注解中获取。
	 */
	@ApiModelProperty("任务名称")
	private String taskName;
	/**
	 * 任务旧名称，默认空，从@ZddTask注解中获取。为了方便直接在代码中修改任务名称，并同步更新数据库。
	 */
	@ApiModelProperty("任务旧名称，默认空，前端忽略此字段")
	private String oldName;
	/**
	 * 任务处理业务逻辑，从@ZddTask注解中获取。
	 */
	@ApiModelProperty("任务处理业务逻辑")
	private String taskDesc;
	/**
	 * 任务周期标准的cron表达式，从@Scheduled注解获取，仅显示作用。修改此值不会影响任务的周期，因为没有同步功能。
	 */
	@ApiModelProperty("任务周期标准的cron表达式,，前端忽略此字段")
	private String cron;
	/**
	 * 任务周期描述，从@ZddTask注解中获取。
	 */
	@ApiModelProperty("任务周期描述")
	private String cronDesc;
	/**
	 * 最后一次执行时间
	 */
	@ApiModelProperty("最后一次执行时间")
	private Date lastExecTime;
	/**
	 * 1：正常 2：停止 （修改此值可以直接开启或停止任务的执行）
	 */
	@ApiModelProperty("1：正常 2：停止 （修改此值可以直接开启或停止任务的执行）")
	private Integer state;
	private Date createtime;
	private Date updatetime;

	@Override
	protected Serializable pkVal() {
		return this.id;
	}

	public static SystemScheduleTask of(ZddTask zddTask, Scheduled scheduled) {
		if (zddTask == null) return null;
		SystemScheduleTask scheduleTask = new SystemScheduleTask();
		scheduleTask.setTaskName(zddTask.name())
				.setOldName(zddTask.oldName())
				.setTaskDesc(zddTask.desc())
				.setCronDesc(zddTask.cronDesc());

		if (scheduled != null) {
			scheduleTask.setCron(scheduled.cron());
		}
		return scheduleTask;
	}

	public void merge(SystemScheduleTask newTask) {
		if (newTask == null) return;
		this.taskName = newTask.taskName;
		this.oldName = newTask.oldName;
		this.taskDesc = newTask.taskDesc;
		this.cron = newTask.cron;
		this.cronDesc = newTask.cronDesc;
	}

}
